#-*- codeing = utf-8 -*-
#@Time : 2020/10/18 12:07
#@Author : 阳某
#@File : pandas新增数据列.py
#@Software : PyCharm

import pandas as pd
# 直接赋值
# df.apply方法
# df.assign方法
# 按条件选择分组分别赋值

# 0、读取csv数据到dataframe
df = pd.read_csv('./files/beijing_tianqi_2018.csv')
print(df.head())
# 1、直接赋值的方法,实例：清理温度列，变成数字类型
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
print(df.head())
# 实例：计算温差
# # 注意，df["bWendu"]其实是一个Series，后面的减法返回的是Series
df.loc[:, "wencha"] = df["bWendu"] - df["yWendu"]
# 增加了一列‘wencha’
print(df.head())
# 2、df.apply方法
# 传递给函数的对象是序列对象，其索引要么是DataFrame的索引（axis=0）要么是DataFrame的列（axis=1）。
# 实例：添加一列温度类型：
# 如果最高温度大于33度就是高温
# 低于-10度是低温
# 否则是常温
def get_wendu_type(x):
    if x["bWendu"] > 33:
        return '高温'
    if x["yWendu"] < -10:
        return '低温'
    return '常温'
# 注意需要设置axis==1，这是series的索引是columns
df.loc[:,'wendu_type'] = df.apply(get_wendu_type,axis=1)
# 查看温度类型的计数
print(df["wendu_type"].value_counts())

# 3、df.assign方法
# 为dataframe分配新列, 返回一个新对象，除了新列外，还包含所有原始列。
# 实例：将温度从摄氏度变成华氏度
# 可以同时添加多个新的列
print(df.assign(
    yWendu_huashi = lambda x : x["yWendu"] * 9 / 5 + 32,
    # 摄氏度转华氏度
    bWendu_huashi = lambda x : x["bWendu"] * 9 / 5 + 32
))

# 4、按条件选择分组分别赋值
# 按条件先选择数据，然后对这部分数据赋值新列
# 实例：高低温差大于10度，则认为温差大

# 先创建空列（这是第一种创建新列的方法）
df['wencha_type'] = ''
df.loc[df["bWendu"]-df["yWendu"]>10, "wencha_type"] = "温差大"
df.loc[df["bWendu"]-df["yWendu"]<=10, "wencha_type"] = "温差正常"

print(df['wencha_type'].value_counts())